#ifndef __KWS_MFCC_H__
#define __KWS_MFCC_H__

#include "arm_math.h"
#include "string.h"

/* 组成段的数据帧个数 */
#define NUM_FRAMES 49
#define SAMP_FREQ 16000
/* MFCC滤波器数量 */
#define NUM_FBANK_BINS 40
#define MFCC_DEC_BITS 1
/* 梅尔滤波器组高频和低频频率设定 */
#define MEL_LOW_FREQ 20
#define MEL_HIGH_FREQ 4000
/* 存储MFCC特征的buf大小 */
#define MFCC_BUFFER_SIZE (NUM_FRAMES * NUM_MFCC_COEFFS)
#define FRAME_LEN_MS 40
#define FRAME_LEN ((int16_t)(SAMP_FREQ * 0.001 * FRAME_LEN_MS))
#define NUM_MFCC_COEFFS 10
#define FRAME_SHIFT_MS 20
#define FRAME_SHIFT ((int16_t)(SAMP_FREQ * 0.001 * FRAME_SHIFT_MS))

#ifndef  M_2PI
	#define M_2PI 6.283185307179586476925286766559005
#endif
#ifndef M_PI
	#define M_PI  3.14159265358979323846264338327950288
#endif

/* MFCC提取特征结构体 */
typedef struct  mfcc_str
{
	int num_mfcc_features;
	int frame_len;
	int frame_len_padded;
	int mfcc_dec_bits;
	float * frame;
	float * buffer;
	float * mel_energies;
	float * window_func;
	int32_t * fbank_filter_first;
	int32_t * fbank_filter_last;
	float ** mel_fbank;
	float * dct_matrix;
	arm_rfft_fast_instance_f32 * rfft;
}MFCC_STR;

#ifdef __cplusplus
extern    "C"
{
#endif

/*
 * @brief 计算梅尔频率倒谱系数
 * @param mfcc_str 梅尔频率提取特征结构体，用于配置必须要的参数
 * @param audio_data 音频数据
 * @param mfcc_out，输出值
 */
void mfcc_compute(MFCC_STR *mfcc_str, const int16_t * audio_data, q7_t* mfcc_out);
/*
 * @brief 初始化梅尔频率结构体
 * @param mfcc_str 梅尔频率提取特征结构体，用于配置必须要的参数
 * @param num_mfcc_features MFCC的有效数量
 * @param frame_len， 帧长
 * @para mfcc_dec_bits，离散余弦变换的位移值
 */
int32_t mfcc_init(MFCC_STR *mfcc_str, int num_mfcc_features, int frame_len, int mfcc_dec_bits);

#ifdef __cplusplus
}
#endif

#endif
